package com.oweight.sagacious.payment.domain.model;

import cn.hutool.core.util.StrUtil;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * 微信退款请求参数
 *
 * @author 周广明
 * @version v1 12/20/19 10:18 AM
 */
@Data
public class WeChatPayRefundModel implements Serializable {
    private static final long serialVersionUID = -5277130373071844815L;

    /**
     * <pre>
     * 字段名：微信订单号.
     * 变量名：transaction_id
     * 是否必填：跟out_trade_no二选一
     * 类型：String(28)
     * 示例值：1217752501201400000000000000
     * 描述：微信生成的订单号，在支付通知中有返回
     * </pre>
     */
    private String transactionId;
    /**
     * <pre>
     * 字段名：商户订单号.
     * 变量名：out_trade_no
     * 是否必填：跟transaction_id二选一
     * 类型：String(32)
     * 示例值：1217752501201400000000000000
     * 描述：商户侧传给微信的订单号
     * </pre>
     */
    private String outTradeNo;
    /**
     * <pre>
     * 字段名：商户退款单号.
     * 变量名：out_refund_no
     * 是否必填：是
     * 类型：String(32)
     * 示例值：1217752501201400000000000000
     * 描述：商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔
     * </pre>
     */
    @NotNull
    private String outRefundNo;
    /**
     * <pre>
     * 字段名：订单金额.
     * 变量名：total_fee
     * 是否必填：是
     * 类型：Int
     * 示例值：100
     * 描述：订单总金额，单位为分，只能为整数，详见支付金额
     * </pre>
     */
    @NotNull
    private Integer totalFee;

    /**
     * <pre>
     * 字段名：退款金额.
     * 变量名：refund_fee
     * 是否必填：是
     * 类型：Int
     * 示例值：100
     * 描述：退款总金额，订单总金额，单位为分，只能为整数，详见支付金额
     * </pre>
     */
    @NotNull
    private Integer refundFee;

    /**
     * <pre>
     * 字段名：操作员.
     * 变量名：op_user_id
     * 是否必填：是
     * 类型：String(32)
     * 示例值：1900000109
     * 描述：操作员帐号, 默认为商户号
     * </pre>
     */
    @NotNull
    private String opUserId;

    /**
     * <pre>
     * 字段名：退款原因.
     * 变量名：refund_account
     * 是否必填：否
     * 类型：String(80)
     * 示例值：商品已售完
     * 描述：若商户传入，会在下发给用户的退款消息中体现退款原因
     * </pre>
     */
    private String refundDesc;

    /**
     * @param transactionId 微信订单号
     * @param outTradeNo    商户订单号
     * @param outRefundNo   商户退款单号
     * @param totalFee      总金额（单位：分）
     * @param refundFee     退款金额（单位：分）
     * @param opUserId      操作员
     */
    public WeChatPayRefundModel(String transactionId, String outTradeNo,
                                @NotNull String outRefundNo, @NotNull Integer totalFee,
                                @NotNull Integer refundFee, @NotNull String opUserId) {

        if (StrUtil.isBlank(transactionId) && StrUtil.isBlank(outTradeNo)) {
            throw new IllegalArgumentException("transaction_id跟out_trade_no二选一！");
        }
        this.transactionId = transactionId;
        this.outTradeNo = outTradeNo;
        this.outRefundNo = outRefundNo;
        this.opUserId = opUserId;
        this.totalFee = totalFee;
        this.refundFee = refundFee;

    }
}
